package com.example.android.architecture.blueprints.todoapp.tasks;

import com.example.android.architecture.blueprints.todoapp.ToDoApplication;
import com.example.android.architecture.blueprints.todoapp.data.source.TasksRepositoryComponent;
import com.example.android.architecture.blueprints.todoapp.util.FragmentScoped;

import dagger.Component;

/**
 * This is a Dagger component. Refer to {@link ToDoApplication} for the list of Dagger components
 * used in this application.
 * <P>
 * Because this component depends on the {@link TasksRepositoryComponent}, which is a singleton, a
 * scope must be specified. All fragment components use a custom scope for this purpose.
 */
//这个依赖注入真是依赖注入，就是一层提供一层的注入即可，缺什么就找下一个去注入，
    //第一层提供了一个注入对象，如果这个被注入的对象还有其他参数，那么在按照第一步那样，提供
    //第一层依赖的参数的注入刚发，这样，每个对象都有依赖可寻，都提供了注入
// TasksPresenterModule 提供 TasksPresenter(TasksRepository tasksRepository, TasksContract.View tasksView
    //中的 TasksContract.View 对象注入
    //TasksRepositoryComponent 依赖提供了 TasksRepository 对象的注入
    //这里的 Scope 其实不起作用但是只是为了让编译通过，如果去掉是编译通不过的
    //因为 其依赖的 TasksRepositoryComponent 使用了 @Single 类型的Scope 所以其
    //子类必须也有Scope 也就是所起所依赖的类带有 Scope 那么该类必须指定一个 Scope 否则编译不过
@FragmentScoped
@Component(dependencies = TasksRepositoryComponent.class, modules = TasksPresenterModule.class)
public interface TasksComponent {
	
    void inject(TasksActivity activity);
}
